home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / amiga / animutil / kfast / kfast.lzh / KFAST / src / file2.c < prev    next >
C/C++ Source or Header  |  1992-07-03  |  6KB  |  286 lines

  1. #include "skeleton.h"
  2. #include <exec/libraries.h>
  3. #include <proto/intuition.h>
  4. #include <proto/req.h>
  5.  
  6. FILE * ptr = NULL;
  7.  
  8. char f[DSIZE+FCHARS] = "",*file = &f[0];
  9.  
  10. struct ReqFileRequester    MyFileReqStruct;
  11. char filename[FCHARS] = "";
  12. char directoryname[DSIZE] = "";
  13.  
  14. BOOL filerequest(void)
  15. {
  16.     BOOL result;
  17.     
  18.     file[0] = 0;
  19.     MyFileReqStruct.PathName = file;
  20.     MyFileReqStruct.Dir = directoryname;
  21.     MyFileReqStruct.File = filename;
  22.     MyFileReqStruct.Flags = FRQCACHINGM;
  23.     MyFileReqStruct.dirnamescolor = 2;
  24.     MyFileReqStruct.devicenamescolor = 2;
  25.     result = FileRequester(&MyFileReqStruct);
  26.     PurgeFiles(&MyFileReqStruct);
  27.  
  28.     if(filename[0]==0)
  29.         return(FALSE);
  30.         
  31.     return(result);
  32. }
  33.  
  34. void new(void)
  35. {
  36.     obj_ptr frame,next,hold;
  37.  
  38.     frame = framehead;
  39.  
  40.     while(frame!=NULL)
  41.     {
  42.         next = frame->next;
  43.         while(frame!=NULL)
  44.         {
  45.             hold = frame->framedown;
  46.             if(frame->image!=NULL) deleteline(frame->image);
  47.             if(frame->skeleton!=NULL) deleteline(frame->skeleton);
  48.             if(frame->outline!=NULL) deleteline(frame->outline);
  49.             free(frame,sizeof(struct object));
  50.             frame = hold;
  51.         }
  52.         frame = next;
  53.     }
  54.  
  55. /* adjust global variables */
  56.     framehead = makeobject();
  57. }
  58.  
  59.  
  60. void writeline(line_ptr line)
  61. {
  62.     /* not too sure what will happen to structures with 0 pts */
  63.     while(line!=NULL)
  64.     {
  65.         fwrite((char *)line,sizeof(struct line),1,ptr);
  66.         if((line->pts!=NULL) && (line->number!=0))
  67.             fwrite((char *)line->pts,sizeof(struct pts),line->number,ptr);
  68.         line=line->next;
  69.     }
  70. }
  71.  
  72. line_ptr readline(void)
  73. {
  74.     line_ptr first,seg,prev;
  75.     /* not too sure what will happen to structures with 0 pts */
  76.  
  77.     prev = NULL;
  78.         seg=(line_ptr)malloc(sizeof(struct line));
  79.     first = seg;
  80.     do
  81.     {
  82.         if(fread((char *)seg,sizeof(struct line),1,ptr)==0)
  83.         {
  84.             free(seg,sizeof(struct line));
  85.             if(prev!=NULL) prev->next = NULL;
  86.             if(first==seg)
  87.                 return(NULL);
  88.             else
  89.                 return(first);
  90.             
  91.         }
  92.         if((seg->pts!=NULL) && (seg->number!=0))
  93.         {
  94.             seg->pts=(struct pts *)malloc(sizeof(struct pts)*POINTS*((seg->number-1)/POINTS+1));
  95.             if(fread((char *)seg->pts,sizeof(struct pts),seg->number,ptr)!=seg->number)
  96.             {
  97.                 free(seg->pts,sizeof(struct pts)*POINTS*((seg->number-1)/POINTS+1));
  98.                 seg->pts = NULL;
  99.                 seg->number = 0;
  100.                 seg->next = NULL;
  101.                 return(first);
  102.             }
  103.             if(seg->number==1)
  104.             {
  105.                 seg->pts->p[1][0] = seg->pts->p[0][0];
  106.                 seg->pts->p[1][1] = seg->pts->p[0][1];
  107.             }
  108.         }
  109.         else
  110.         {
  111.             seg->pts = NULL;
  112.             seg->number = 0;
  113.         }
  114.         if(seg->next!=NULL)
  115.             seg->next=(line_ptr)malloc(sizeof(struct line));
  116.         prev = seg;
  117.         seg = seg->next;
  118.     }
  119.     while(seg!=NULL);
  120.     
  121.     return(first);
  122. }
  123.  
  124. void writeobject(obj_ptr object)
  125. {
  126.     if(object==NULL) return;
  127.  
  128.     fwrite((char *)object,sizeof(struct object),1,ptr);
  129.  
  130.     if(((object->entry&IMAGE)!=0) && (object->image!=NULL))
  131.     {
  132.         writeline(object->image);
  133.     }
  134.     if(((object->entry&SKELETON)!=0) && (object->skeleton!=NULL))
  135.     {
  136.         writeline(object->skeleton);
  137.     }
  138.     if(((object->entry&XOUTLINE)!=0) && (object->outline!=NULL))
  139.     {
  140.         writeline(object->outline);
  141.     }
  142. }
  143.  
  144. obj_ptr readobject(void)
  145. {
  146.     obj_ptr object;
  147.  
  148.     object = makeobject(); /* clear things up */
  149.     if(fread((char *)object,sizeof(struct object),1,ptr)==0)
  150.     {
  151.         free(object,sizeof(struct object));
  152.         return(NULL);
  153.     }
  154.     if(((object->entry&IMAGE)!=0) && (object->image!=NULL))
  155.         object->image = readline();
  156.     else
  157.         object->image = NULL;    
  158.     if(((object->entry&SKELETON)!=0) && (object->skeleton!=NULL))
  159.         object->skeleton = readline();
  160.     else
  161.         object->skeleton = NULL;
  162.     if(((object->entry&XOUTLINE)!=0) && (object->outline!=NULL))
  163.         object->outline = readline();
  164.     else
  165.         object->outline = NULL;
  166.  
  167.     return(object);
  168. }
  169.  
  170. void writechain(obj_ptr chain)
  171. {
  172.     /* writes first and any subsequents with entry flags*/
  173.     obj_ptr next,hold;
  174.     int count;
  175.     
  176.     while(chain!=NULL)
  177.     {
  178.         next = chain->next;
  179.         hold = chain->next;
  180.         
  181.         count = 1;
  182.         while((next!=NULL) && (next->entry==0))
  183.         {
  184.             next = next->next;
  185.             count++;
  186.         }
  187.         if(next==NULL) count = 0;
  188.         chain->next = (obj_ptr)count;    /* store number of frames to next */
  189.         writeobject(chain);
  190.         chain->next = hold;
  191.         chain = next;
  192.     }
  193. }
  194.  
  195. obj_ptr readchain(void)
  196. {
  197.     /* writes first and any subsequents with entry flags*/
  198.     obj_ptr first, object,next;
  199.     int count;
  200.  
  201.     object = readobject();
  202.     first = object;
  203.     
  204.     while(object!=NULL)
  205.     {
  206.         count = (int)object->next;
  207.         object->frameup=object->framedown=NULL;
  208.         if(count!=0)
  209.         {
  210.             next = readobject();
  211.             object->next = NULL;
  212.             addobject(object,next,count);
  213.         }
  214.         else
  215.             next = NULL;
  216.         object = next;
  217.     }
  218.     
  219.     return(first);
  220. }
  221.  
  222. void save(void)
  223. {
  224.     obj_ptr chain,frame;
  225.  
  226.     int count;
  227.  
  228.     ptr = fopen(file,"w");
  229.     if(ptr==NULL) return;
  230.     
  231.     frame = framehead;
  232.     count = 0;
  233.     
  234.     while(frame!=NULL)
  235.     {
  236.     chain = frame->framedown;
  237.     while(chain!=NULL)
  238.     {
  239.         if(chain->prev==NULL)
  240.         {
  241.             chain->prev = (obj_ptr)count;
  242.             writechain(chain);
  243.         }
  244.         chain = chain->framedown;
  245.     }
  246.     frame = frame->next;
  247.     count++;
  248.     }
  249.     fclose(ptr);
  250. }
  251.  
  252. void load(void)
  253. {
  254.     obj_ptr chain,frame;
  255.  
  256.     int count,pos;
  257.  
  258.     ptr = fopen(file,"r");
  259.     if(ptr==NULL) return;
  260.     
  261.     new();
  262.     count = 0;    /* 1 frame has header */
  263.    
  264.     chain = readchain();   
  265.     while(chain!=NULL)
  266.     {
  267.         pos = (int)chain->prev;
  268.         chain->prev = NULL;
  269.     
  270.         if(pos>count)
  271.         {
  272.         addobject(framehead,makeobject(),pos);
  273.         count = pos;
  274.         }
  275.  
  276.         frame = framehead;
  277.         for(;pos>0;pos--)
  278.             frame = frame->next;
  279.         addchain(frame,chain);
  280.     
  281.     chain = readchain();
  282.     }
  283.     fclose(ptr);
  284. }
  285.     
  286.